package Demo;

public class Demo01 {
    /**
     * 数组(Array)
     *     1、Java语言中的数组是一种引用数据类型。不属于基本数据类型。数组的父类是Object。
     *     2、数组实际上是一个容器，可以同时容纳多个元素。（数组是一个数据的集合。）
     *     数组：字面意思是“一组数据”
     *     3、*数组当中可以存储“基本数据类型”的数据，也可以存储“引用数据类型”的数据。
     *     4、数组因为是引用类型，所以数组对象是堆内存当中。（数组是存储在堆当中的）
     *     5、数组当中如果存储的是“java对象”的话，实际上存储的是对象的“引用（内存地址）”，数组中不能直接存储java对象。
     *     6、*数组一旦创建，在java中规定，长度不可变。（数组长度不可变）
     *     7、数组的分类：一维数组、二维数组、三维数组、多维数组...（一维数组较多，二维数组偶尔使用！）
     *     8、所有的数组对象都有length属性(java自带的)，用来获取数组中元素的个数。
     *     9、*java中的数组要求数组中元素的类型统一。比如int类型数组只能存储int类型，Person类型数组只能存储Person类型。
     *     例如：超市购物，购物袋中只能装苹果，不能同时装苹果和橘子。（数组中存储的元素类型统一）
     *     10、*数组在内存方面存储的时候，数组中的元素内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。内存地址连续。
     *     这是数组存储元素的特点（特色）。数组实际上是一种简单的数据结构。
     *     11、所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。
     *     （数组中首元素的内存地址作为整个数组对象的内存地址。）
     *     12、*数组中每一个元素都是有下标的，下标从0开始，以1递增。最后一个元素的下标是：length - 1
     *     下标非常重要，因为我们对数组中元素进行“存取”的时候，都需要通过下标来进行。
     *
     * 	1.1、数组的优点和缺点，并且要理解为什么。
     * 		第一：空间存储上，内存地址是连续的。
     * 		第二：每个元素占用的空间大小相同。
     * 		第三：知道首元素的内存地址。
     * 		第四：通过下标可以计算出偏移量。
     * 		通过一个数学表达式，就可以快速计算出某个下标位置上元素的内存地址，
     * 		直接通过内存地址定位，效率非常高。
     *
     * 		优点：检索效率高。
     * 		缺点：1.随机增删元素效率比较低：因为后续元素都需要移动，但末尾元素增删不受影响。
     *  * 		 2.数组无法存储大数据量（很难在内存空间找到一块非常巨大且连续的内存空间）
     * 		注意：数组最后一个元素的增删效率不受影响。
     *
     * 	1.2、一维数组的静态初始化和动态初始化
     * 		静态初始化：
     * 			int[] arr = {1,2,3,4};
     * 			Object[] objs = {new Object(), new Object(), new Object()};
     * 		动态初始化：
     * 			int[] arr = new int[4]; // 4个长度，每个元素默认值0
     * 			Object[] objs = new Object[4]; // 4个长度，每个元素默认值null
     *
     * 	1.3、一维数组的遍历
     * 		for(int i = 0; i < arr.length; i++){
     * 			    System.out.println(arr[i]);
     *          }
     *
     * 	1.4、二维数组的静态初始化和动态初始化
     * 		静态初始化：
     * 			int[][] arr = {
     *                                    {1,2,34},
     *                                    {54,4,34,3},
     *                                    {2,34,4,5}
     *                                };
     *
     * 			Object[][] arr = {
     *                                    {new Object(),new Object()},
     *                                    {new Object(),new Object()},
     *                                    {new Object(),new Object(),new Object()}
     *                                };
     * 		动态初始化：
     * 			int[][] arr = new int[3][4];
     * 			Object[][] arr = new Object[4][4];
     * 			Animal[][] arr = new Animal[3][4];
     * 			// Person类型数组，里面可以存储Person类型对象，以及Person类型的子类型都可以。
     * 			Person[][] arr = new Person[2][2];
     * 			....
     *
     * 	1.5、二维数组的遍历
     * 		for(int i = 0; i < arr.length; i++){ // 外层for循环负责遍历外面的一维数组。
     * 			// 里面这个for循环负责遍历二维数组里面的一维数组。
     * 			for(int j = 0; j < arr[i].length; j++){
     * 				System.out.print(arr[i][j]);
     *            }
     * 			// 换行。
     * 			System.out.println();
     *        }
     *
     * 	1.6、main方法上“String[] args”参数的使用（非重点，了解一下，以后一般都是有界面的，用户可以在界面上输入用户名和密码等参数信息。）
     *
     * 	1.7、数组的拷贝：System.arraycopy()方法的使用
     * 		数组有一个特点：长度一旦确定，不可变。
     * 		所以数组长度不够的时候，需要扩容，扩容的机制是：新建一个大数组，
     * 		将小数组中的数据拷贝到大数组，然后小数组对象被垃圾回收。
     *
     * 	1.8、对数组中存储引用数据类型的情况，要会画它的内存结构图。
     * */
}
